package cn.com.wdjedu.androidapp.wjeduandroid.rxjava;

import android.util.Log;

import retrofit2.adapter.rxjava.HttpException;
import rx.Subscriber;

import static android.content.ContentValues.TAG;

/**
 * Created by samson on 26/11/2016.
 */

public class SubscriberCallBack<T> extends Subscriber<T> {

    private ApiCallback<T> apiCallback;

    public SubscriberCallBack(ApiCallback<T> apiCallback){this.apiCallback = apiCallback;}


    //onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理，还会把它们看做一个队列。RxJava 规定，当不会再有新的 onNext() 发出时，需要触发 onCompleted() 方法作为标志。
    // onError(): 事件队列异常。在事件处理过程中出异常时，onError() 会被触发，同时队列自动终止，不允许再有事件发出。
    // 在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个，并且是事件序列中的最后一个。需要注意的是，onCompleted() 和 onError() 二者也是互斥的，即在队列中调用了其中一个，就不应该再调用另一个。

    //本类作为Rxjava中的观察者observer
    //Subscriber 是 Observer的一种抽象类


    @Override
    public void onCompleted() {
        apiCallback.onCompleted();
        Log.d(TAG, "onCompleted: Completed!");
    }

    @Override
    public void onError(Throwable e) {
        Log.d(TAG, "onError: Error on :"+e.getLocalizedMessage());
        e.printStackTrace();
        if (e instanceof HttpException) {
            HttpException httpException = (HttpException) e;
            //httpException.response().errorBody().string()
            int code = httpException.code();
            String msg = httpException.getMessage();
            if (code == 504) {
                msg = "网络不给力";
            }
            apiCallback.onFailure(code, msg);
        } else {
            apiCallback.onFailure(0, e.getMessage());
        }
        apiCallback.onCompleted();
    }

    @Override
    public void onNext(T t) {
        apiCallback.onSuccess(t);
        Log.d(TAG, "onNext: Item: " + t);
    }



    //其他
    //unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法，用于取消订阅。
    // 在这个方法被调用后，Subscriber 将不再接收事件。
    // 一般在这个方法调用前，可以使用 isUnsubscribed() 先判断一下状态。
    // unsubscribe() 这个方法很重要，因为在 subscribe() 之后， Observable 会持有 Subscriber 的引用，
    // 这个引用如果不能及时被释放，将有内存泄露的风险。
    // 所以最好保持一个原则：要在不再使用的时候尽快在合适的地方（例如 onPause() onStop() 等方法中）
    // 调用 unsubscribe() 来解除引用关系，以避免内存泄露的发生。




}